package com.atguigu.juc.interview.thread.pool;

import java.util.concurrent.*;

/**
 * @author leimingchao
 * @create 2021-04-12 0:08
 */
public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
        //获取计算机的逻辑处理器数
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println(processors);
        /**
         * ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
         *
         * corePoolSize：线程池中的常驻核心线程数
         * maximumPoolSize：线程池中能够容纳同时执行任务的最大线程数，此值必须大于等于1，
         *                  如果是CPU密集型，最大线程数 = CPU核数 + 1
         *                  如果是IO密集型，最大线程数 = CPU核心数/(1-阻塞系数)，阻塞系数一般0.8~0.9，双核CPU理想线程数20，动态线程池看压测情况
         * keepAliveTime：多余的空闲线程的存活时间（线程生命周期），当前池中线程数量超过corePoolSize时，当空闲时间达到keepAliveTime时，多余线程会被销毁直到只剩下corePoolSize个线程为止
         * unit：keepAliveTime的单位
         * workQueue：任务队列，被提交但尚未被执行的任务（类似银行的候客区）
         * threadFactory：表示生成线程池中工作线程的线程工厂，用于创建线程，一般默认即可
         * handler：拒绝策略，表示当队列满了，并且工作线程大于等于线程池的最大线程数时如何来拒绝请求执行的runnable的策略
         *        AbortPolicy():默认，直接抛出RejectedExecutionException异常阻止系统正常运行
         *        CallerRunsPolicy():"调用者运行"一种调节机制，该策略既不会抛弃任务，也不会抛出异常，而是将某些任务回退到调用者，从而降低新任务的流量
         *        DiscardPolicy():该策略默默地丢弃无法处理的任务，不予任何处理也不抛出异常，如果允许任务丢失，这是最好的一种策略
         *        DiscardOldestPolicy():抛弃队列中等待最久的任务，然后把当前任务加入队列中尝试再次提交当前任务
         */
        ExecutorService threadPool = new ThreadPoolExecutor(2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

                try {
                    for (int i = 1; i <= 10; i++) {
                        threadPool.submit(() -> System.out.println(Thread.currentThread().getName() + "\t 办理业务"));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    threadPool.shutdown();
                }


        System.out.println(threadPool);
        threadPool.shutdown();
    }
}
